package com.eteng.demo.util;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;

import org.dom4j.Element;

import com.eteng.entity.BillTree;
import com.eteng.entity.CustBillItem;
import com.eteng.entity.CustBillQuery;
import com.eteng.entity.ProductBillTree;

public class XmlParserUtil {

	/**
	 * 账单费用模块名称
	 */
	private static final String ITEM_COST = "10";
	/**
	 * 账单非费用项（客户名称、品牌等）模块名称。
	 */
	private static final String ITEM_UNCOST = "15";
	/**
	 * 账户信息（积分、余额等）模块名称。
	 */
	private static final String ITEM_USRINFO = "16";
	private CustBillQuery entity_cbq;
	private ArrayList<CustBillItem> list_CustBillItem;
	public ArrayList<String> comboStrList = new ArrayList<String>();

	public void testParseXMLData(Element rootElement) {

		list_CustBillItem = new ArrayList<CustBillItem>();
		entity_cbq = new CustBillQuery();

		fillCustBillQuery(rootElement);
		// 组装账单基本信息
		// 组装投递信息
		// 组装费用明细
		// 组装套餐消费情况（空）
		// 组装统计金额
		// 组装消费比例 (空)
		// 组装积分信息
		// 品牌标志信息（空）
		// 近月消费信息（空）
		// 组装备注（空）
		ArrayList<String> finalList = new ArrayList<String>();
		finalList.add(combBaseInfo());
		finalList.add(combMailInfo());
		finalList.add(combDetail());
		finalList.add("");
		finalList.add(listMoney());
		finalList.add("");
		finalList.add(combAccumlateScore());
		finalList.add("");
		finalList.add("");
		finalList.add("");
		
		String finalCombo = StringMaker.divWithSymbol("||", finalList);
		comboStrList.add(finalCombo);
	}

	String combDetail() {
		// (一)套餐内费用$#套餐费用#1#&#用户号码:固话:08513904185宽带:08510851DSL0k220908手机:18008509449手机:18085108884手机:18908504449#2#$;
		// (二)套餐外费用$手机:18008509449#综合信息服务费#2#5.00&#代收费#2#0.30$;$手机:18908504449#短信彩信费#2#1.00&#综合信息服务费#2#6.00&#代收费#2#0.20$
		// %本项小计%397.00
		// (一)套餐内费用$#套餐费用#1#&#我的e家套餐费#2#219.00$;
		// (二)套餐外费用$用户号码:手机:18908587277固话:08583837227宽带:0858085830748654:0858085830748654@itv#:
		// 0858085830748654@itv#2#10.00&#手机:18908587277#2#90.39&#固话:08583837227#2#0.50$
		// %本项小计%639.78

		// 汇总费用信息%产品合计名称%产品合计
		// 汇总费用信息，多个费用信息之间用“;”分隔，包含
		// 汇总费用项$费用明细$小计（单位元，精确到分）
		// 费用明细，多个费用明细间用“&”分隔，包含
		// 项目设备#项目名称#项目级别(1-一级项;2-二级项)#项目金额（单位元，精确到分）

		/**
		 * 经过分析得： 1、如果有套餐，将在第一个节点展示 2、超出费用将在超出费用节点后展示 3、倒数第二项为用户号码，倒数第一项是账单名称
		 */

		String finalStr = "";
		String innerItemHead = "(一)套餐内费用$#套餐费用#1#";
		String outerItemHead = "(二)套餐外费用";
		double comboAmout = 0;
		double outerAmout = 0;

		CustBillItem cbi_module10 = entity_cbq.getCBIList().get(0);
		if (cbi_module10.getModuleID().equals(ITEM_COST)) {
			// BillTree的数目
			int count = cbi_module10.getPBTList().get(0).getBT().size();
			// 1、组合套餐内费用
			// 检查第一项内容
			ArrayList<BillTree> bt_collect = cbi_module10.getPBTList().get(0)
					.getBT();
			ArrayList<String> comboList = new ArrayList<String>();
			BillTree bt_first;
			// 项目设备（空）
			comboList.add("");
			if (bt_collect.get(0).getBillItemName().contains("套餐")) {
				bt_first = bt_collect.get(0);
			} else {
				// 倒数第二项
				bt_first = bt_collect.get(count - 2);
			}
			// 项目名称
			comboList.add(bt_first.getBillItemName());
			// 项目级别(固定值2)
			comboList.add("2");
			// 项目金额
			comboList.add(numPrecent(bt_first.getBillItemAmount()));
			// 套餐费用
			comboAmout = Double.parseDouble(bt_first.getBillItemAmount());
			finalStr = innerItemHead + "&"
					+ StringMaker.divWithSymbol("#", comboList) + "$";
			/********/

			comboList.clear();

			// 2、组合套餐外费用
			// BillParentID 为6001为项目套餐费用
			comboList.add(outerItemHead);
			comboList.add(bt_collect.get(0).getBillItemName());
			for (BillTree outerBT : bt_collect) {
				String outerDetail = "";
				if (outerBT.getBillParentID().equals("60001")) {
					outerDetail = "#" + outerBT.getBillItemName() + "#" + "2"
							+ "#" + numPrecent(outerBT.getBillItemAmount());
					comboList.add(outerDetail);
					outerAmout += Double.parseDouble(outerBT
							.getBillItemAmount());
				}
			}
			// 组合
			finalStr = finalStr + ";"
					+ StringMaker.divWithSymbol("&", comboList) + "$";
			/********/
		} else {
			System.out.println("拼接费用明细时，不处于“10”模块！当前模块是： " + "“"
					+ cbi_module10.getModuleID() + "”");
		}

		ArrayList<String> detailList = new ArrayList<String>();
		detailList.add(finalStr);
		detailList.add("本项小计");
		detailList.add(numPrecent(String.valueOf(comboAmout + outerAmout)));
		return StringMaker.divWithSymbol("%", detailList);
	}
	// 字符串转小数字符串
	String numPrecent(String numStr) {
		double temp;
		DecimalFormat df=new DecimalFormat("#0.00"); 
		temp = Double.parseDouble(numStr) / 100;
		return df.format(temp);
	}

	/**
	 * 组合投递信息
	 */
	String combMailInfo() {
		ArrayList<String> list = new ArrayList<String>();
		String mailAddr = "";
		CustBillItem cbi_module10 = entity_cbq.getCBIList().get(0);
		if (cbi_module10.getModuleID().equals(ITEM_COST)) {
			for (BillTree bt : cbi_module10.getPBTList().get(0).getBT()) {
				if (bt.getBillItemName().equals("投递信息")) {
					mailAddr = bt.getStateDesc();
					list.add(mailAddr);
				}
			}
		} else {
			System.out.println("投递信息错误");
		}
		return StringMaker.divWithSymbol(",", list);
	}

	/**
	 * 统计金额
	 * 
	 * @return
	 */
	String listMoney() {
		// 本期费用合计=789.4（需显示2个地方，1.帐单摘要中；2.帐单费用合计处）
		// 本期已付费用=112 (已出发票预付金+未出发票预付金)
		// 已出发票预付金=35.93
		// 未出发票预付金=76.07
		// 上期余额抵扣=62
		// 本期协议返还话费=50
		// 集团支付费用=0
		// 本期应付费用=677.4 (本期费用合计-本期已付费用-集团支付费用)（需显示2个地方，1.帐单摘要中；2.费用提示处）

		ArrayList<String> ratioSp = new ArrayList<String>();
		String curAmount = "";
		String payed = "";
		String yufu_ed = "";// 空
		String yufu_be = "";// 空
		String prev_banlance = "";
		String cur_back = "";
		String pay_group = "";// 空
		String pay_should = "";

		// module16下的费用信息
		CustBillItem cbiModule16 = entity_cbq.getCBIList().get(2);
		if (cbiModule16.getModuleID().equals(ITEM_USRINFO)) {
			for (BillTree bt : cbiModule16.getPBTList().get(0).getBT()) {
				if (bt.getBillItemName().equals("本期协议返还抵扣")) {
					cur_back = bt.getStateDesc();
				}
				if (bt.getBillItemName().equals("其中上期余额抵扣")) {
					prev_banlance = bt.getStateDesc();
				}
				if (bt.getBillItemName().equals("应付费用")) {
					pay_should = bt.getStateDesc();
				}
				if (bt.getBillItemName().equals("本期已付")) {
					payed = bt.getStateDesc();
				}
				if (bt.getBillItemName().equals("本期未付")) {
					pay_should = bt.getStateDesc();
				}

			}
		}

		ratioSp.add(curAmount);
		ratioSp.add(payed);
		ratioSp.add(yufu_ed);
		ratioSp.add(yufu_be);
		ratioSp.add(prev_banlance);
		ratioSp.add(cur_back);
		ratioSp.add(pay_group);
		ratioSp.add(pay_should);
		return StringMaker.divWithSymbol("%", ratioSp);
	}

	/**
	 * 组装积分字段
	 * 
	 * @return
	 */
	String combAccumlateScore() {
		// 本期末可用积分=300
		// 上期末可用积分=200
		// 当期使用积分=0
		// 本期奖励积分=20
		// 本期新增积分=80
		// 年底到期积分=0
		ArrayList<String> scList = new ArrayList<String>();
		String curSc = "";
		String prevSc = "";
		String curUseSc = "";
		String curRewardSc = "";
		String curAdd = "";
		String yearSrc = "";
		CustBillItem cbiModule16 = entity_cbq.getCBIList().get(2);
		if (cbiModule16.getModuleID().equals(ITEM_USRINFO)) {
			for (int i = 0; i < cbiModule16.getPBTList().get(0).getBT().size(); i++) {
				if (i > 1) {
					BillTree bt = cbiModule16.getPBTList().get(0).getBT()
							.get(i);
					if (bt.getBillItemName().equals("年末到期积分")) {
						yearSrc = bt.getStateDesc();
					}
					if (bt.getBillItemName().equals("本月末可用积分")) {
						curSc = bt.getStateDesc();
					}
					if (bt.getBillItemName().equals("本月新增积分")) {
						curAdd = bt.getStateDesc();
					}
					if (bt.getBillItemName().equals("上月末可用积分")) {
						prevSc = bt.getStateDesc();
					}
					if (bt.getBillItemName().equals("当月使用积分")) {
						curUseSc = bt.getStateDesc();
					}
				}
			}
		} else {
			System.out.println("该节点不在16模块");
		}
		scList.add(curSc);
		scList.add(prevSc);
		scList.add(curUseSc);
		scList.add(curRewardSc);
		scList.add(curAdd);
		scList.add(yearSrc);
		return StringMaker.divWithSymbol("%", scList);
	}

	/**
	 * 组装账单信息
	 * 
	 * @return
	 */
	String combBaseInfo() {
		/**
		 * 根据观察module10 在第一个 module 15 第二个 module 16 第三个 module 20 第四个
		 */
		ArrayList<String> list = new ArrayList<String>();
		// Module10下 城市<ServID AttrType="Integer">571002038014</ServID> 前两位数字
		String cityCode = "";
		String usrId = "";
		CustBillItem cbi_10 = entity_cbq.getCBIList().get(0);
		if (cbi_10.getModuleID().equals(ITEM_COST)) {
			usrId = cbi_10.getPBTList().get(0).getBT().get(0).getServID();
			cityCode = usrId.substring(0, 2);

		} else {
			System.out.println("City码获取失败  module值：" + cbi_10.getModuleID());
		}
		list.add(StringMaker.cityCodeConvert(cityCode));
		// 账单类型：固定值2
		list.add("2");
		// 客户编码 Module15 <BillItemName AttrType="String">客户标识码：</BillItemName>
		// 客户姓名 module15 <BillItemName AttrType="String">客户名称：</BillItemName>
		// 计费周期 Module15 <BillItemName AttrType="String">计费周期：</BillItemName>
		String date = "";
		String usrName = "";
		CustBillItem cbi_15 = entity_cbq.getCBIList().get(1);

		for (ProductBillTree proTree : cbi_15.getPBTList()) {
			for (BillTree bt : proTree.getBT()) {
				if (bt.getBillItemName().equals("计费周期：")) {
					date = bt.getStateDesc();
				}
				if (bt.getBillItemName().equals("客户名称：")) {
					usrName = bt.getStateDesc();
				}
			}
		}
		list.add(usrId);
		list.add(usrName);
		list.add(date);

		return StringMaker.divWithSymbol("%", list);
	}

	/**
	 * 填充CustBillQuery
	 * 
	 * @param eachElement
	 */
	private void fillCustBillQuery(Element father_CBQ) {

		for (Iterator<?> i_CustBillQuery = father_CBQ.elementIterator(); i_CustBillQuery
				.hasNext();) {
			Element child_CBQ = (Element) i_CustBillQuery.next();

			if (child_CBQ.getName().equals("ServID")) {
				entity_cbq.setServID(child_CBQ.getText());
			}
			if (child_CBQ.getName().equals("BillingCycleID")) {
				entity_cbq.setBillingCycleID(child_CBQ.getText());
			}
			if (child_CBQ.getName().equals("DomainID")) {
				entity_cbq.setDomainID(child_CBQ.getText());
			}
			if (child_CBQ.getName().equals("AcctID")) {
				entity_cbq.setAcctID(child_CBQ.getText());
			}
			if (child_CBQ.getName().equals("StaffID")) {
				entity_cbq.setStaffID(child_CBQ.getText());
			}
			if (child_CBQ.getName().equals("CustID")) {
				entity_cbq.setCustID(child_CBQ.getText());
			}
			if (child_CBQ.getName().equals("HisFlag")) {
				entity_cbq.setHisFlag(child_CBQ.getText());
			}
			if (child_CBQ.getName().equals("CustBillItem")) {

				list_CustBillItem.add(fillCustBillItem(child_CBQ));

			}
		}
		entity_cbq.setCBIList(list_CustBillItem);

	}

	private CustBillItem fillCustBillItem(Element father_CBI) {

		ArrayList<ProductBillTree> list_ProductBillTree = new ArrayList<ProductBillTree>();
		CustBillItem entity_cbi = new CustBillItem();
		for (Iterator<?> i_CustBillItem = father_CBI.elementIterator(); i_CustBillItem
				.hasNext();) {
			Element child_CBI = (Element) i_CustBillItem.next();
			if (child_CBI.getName().equals("ModuleID")) {
				entity_cbi.setModuleID(child_CBI.getText());

			}
			if (child_CBI.getName().equals("ProductBillTree")) {
				list_ProductBillTree.add(fillProBT(child_CBI));

			}
		}
		entity_cbi.setPBTList(list_ProductBillTree);
		return entity_cbi;
	}

	/**
	 * 填充ProductBillTree
	 * 
	 * @param eachElement
	 */
	private ProductBillTree fillProBT(Element father_PBT) {

		ArrayList<BillTree> list_BillTree = new ArrayList<BillTree>();
		ProductBillTree entity_pbt = new ProductBillTree();
		for (Iterator<?> i_ProductBillTree = father_PBT.elementIterator(); i_ProductBillTree
				.hasNext();) {
			Element child_PBT = (Element) i_ProductBillTree.next();

			if (child_PBT.getName().equals("SaleID")) {
				entity_pbt.setSaleID(child_PBT.getText());
			}
			if (child_PBT.getName().equals("ServPkgID")) {
				entity_pbt.setServPkgID(child_PBT.getText());
			}
			if (child_PBT.getName().equals("BillType")) {
				entity_pbt.setBillType(child_PBT.getText());
			}
			if (child_PBT.getName().equals("BillTree")) {
				list_BillTree.add(fillBillTree(child_PBT));
			}
		}
		entity_pbt.setBT(list_BillTree);
		return entity_pbt;
	}

	private BillTree fillBillTree(Element father_BT) {

		BillTree entity_bt = new BillTree();
		for (Iterator<?> i_BillTree = father_BT.elementIterator(); i_BillTree
				.hasNext();) {
			Element child_BT = (Element) i_BillTree.next();
			if (child_BT.getName().equals("ServID")) {
				entity_bt.setServID(child_BT.getText());
			}
			if (child_BT.getName().equals("AccNbr")) {
				entity_bt.setAccNbr(child_BT.getText());
			}
			if (child_BT.getName().equals("BillItemTypeID")) {
				entity_bt.setBillItemTypeID(child_BT.getText());
			}
			if (child_BT.getName().equals("BillItemAmount")) {
				entity_bt.setBillItemAmount(child_BT.getText());
			}
			if (child_BT.getName().equals("BillItemName")) {
				entity_bt.setBillItemName(child_BT.getText());

			}
			if (child_BT.getName().equals("BillParentID")) {
				entity_bt.setBillParentID(child_BT.getText());
			}
			if (child_BT.getName().equals("PrintOrder")) {
				entity_bt.setPrintOrder(child_BT.getText());
			}
			if (child_BT.getName().equals("State")) {
				entity_bt.setState(child_BT.getText());
			}
			if (child_BT.getName().equals("StateDate")) {
				entity_bt.setStateDate(child_BT.getText());
			}
			if (child_BT.getName().equals("StateDesc")) {
				entity_bt.setStateDesc(child_BT.getText());
			}
			if (child_BT.getName().equals("ProductName")) {
				entity_bt.setProductName(child_BT.getText());
			}
		}
		return entity_bt;
	}
}